﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Data;

namespace GestorDeFlotas.Core
{
    public class Turno
    {
        public int Id { get; set; }
        public string Descripcion { get; set; }
        public bool Activo { get; set; }
        public decimal horaInicio { get; set; }
        public decimal horaFin { get; set; }
        public decimal valorBandera { get; set; }
        public decimal valorFicha { get; set; }

        public Turno(int ID)
        {
            this.Id = ID;
        }
        public Turno()
        {
        }
        public Turno Cargar()
        {
            using (SqlConnection connection = SqlUtils.GetConnection())
            {
                string sql = string.Format("SELECT tur_hora_inicio, tur_hora_fin, tur_valor_ficha, tur_valor_bandera, tur_descripcion, tur_activo " +
                    "FROM CRAZY_TAXI.TL_TURNOS WHERE tur_id = {0}", this.Id);
                SqlCommand getTurno = SqlUtils.GetNewCommand(sql);
                getTurno.Connection = connection;
                getTurno.Connection.Open();
                SqlDataReader reader = getTurno.ExecuteReader();

                if (reader.HasRows)
                {
                    reader.Read();
                    this.horaInicio = reader.GetDecimal(0);
                    this.horaFin = reader.GetDecimal(1);
                    this.valorFicha = reader.GetDecimal(2);
                    this.valorBandera = reader.GetDecimal(3);
                    this.Descripcion = reader.GetString(4);
                    this.Activo = reader.GetBoolean(5);
                   
                }
                else
                {
                    throw new Exception(string.Format("No existe un Turno con código {0}.", this.Id));
                }

                reader.Close();
                return this;
            }
        }
       
        public void Crear()
        {
            using (SqlConnection connection = SqlUtils.GetConnection())
            {
                connection.Open();
                SqlTransaction transaction = connection.BeginTransaction();

                try
                {
                    CrearTurno(connection, transaction);
                    transaction.Commit();
                }
                catch (Exception)
                {
                    transaction.Rollback();
                    throw;
                }
            }
        }
        private void CrearTurno(SqlConnection connection, SqlTransaction transaction)
        {
            string sql = "INSERT INTO [GD1C2012].[CRAZY_TAXI].[TL_TURNOS] ([tur_hora_inicio],[tur_hora_fin],[tur_valor_ficha],[tur_valor_bandera],[tur_descripcion],[tur_activo] )" +
            " VALUES (@inicio, @fin, @ficha, @bandera, @descripcion, @activo);  SELECT scope_identity() AS LastID";
            SqlCommand crearTurno = SqlUtils.GetNewCommand(sql);

            SqlParameter paramInicio = new SqlParameter("@inicio", SqlDbType.Decimal);
            paramInicio.IsNullable = false;
            paramInicio.Value = this.horaInicio;

            SqlParameter paramFin = new SqlParameter("@fin", SqlDbType.Decimal);
            paramFin.IsNullable = false;
            paramFin.Value = this.horaFin;

            SqlParameter paramFicha = new SqlParameter("@ficha", SqlDbType.Decimal);
            paramFicha.IsNullable = false;
            paramFicha.Value = this.valorFicha;

            SqlParameter paramBandera = new SqlParameter("@bandera", SqlDbType.Decimal);
            paramBandera.IsNullable = false;
            paramBandera.Value = this.valorBandera;

            SqlParameter paramDesc = new SqlParameter("@descripcion", SqlDbType.VarChar);
            paramDesc.IsNullable = false;
            paramDesc.Value = this.Descripcion;

            SqlParameter paramActivo = new SqlParameter("@activo", SqlDbType.Bit);
            paramActivo.IsNullable = false;
            paramActivo.Value = 1;

            crearTurno.Parameters.Add(paramInicio);
            crearTurno.Parameters.Add(paramFin);
            crearTurno.Parameters.Add(paramFicha);
            crearTurno.Parameters.Add(paramBandera);
            crearTurno.Parameters.Add(paramDesc);
            crearTurno.Parameters.Add(paramActivo);
     
            crearTurno.Connection = connection;
            crearTurno.Transaction = transaction;
            this.Id = Convert.ToInt32(crearTurno.ExecuteScalar());
         }

       
        private static Turno ConvertirTurno(IDataReader reader, bool cargarRelaciones)
        {
            Turno turno = new Turno();

            turno.horaInicio = reader.GetDecimal(0);
            turno.horaFin = reader.GetDecimal(1);
            turno.valorFicha = reader.GetDecimal(2);
            turno.valorBandera = reader.GetDecimal(3);
            turno.Descripcion = reader.GetString(4);
            turno.Activo = reader.GetBoolean(5);
            turno.Id = reader.GetInt32(6);

            return turno;
        }
        public DataTable CargarTabla(string DescripcionIngresada)
        {
            DataTable dt = new DataTable();
            using (SqlConnection connection = SqlUtils.GetConnection())
            {
                string sql = "SELECT tur_hora_inicio, tur_hora_fin, tur_valor_ficha, tur_valor_bandera, tur_descripcion, tur_activo, tur_id " +
                    "FROM CRAZY_TAXI.TL_TURNOS WHERE tur_descripcion LIKE @DescripcionIngresada";
                SqlCommand getTurno = SqlUtils.GetNewCommand(sql);

                SqlParameter rowParameter = new SqlParameter("@DescripcionIngresada", SqlDbType.VarChar);
                rowParameter.IsNullable = false;
                rowParameter.Value = DescripcionIngresada;

                getTurno.Parameters.Add(rowParameter);
                getTurno.Connection = connection;
                getTurno.Connection.Open();
                SqlDataAdapter da = new SqlDataAdapter(getTurno);
                da.Fill(dt);
                
                return dt;
                //SqlDataReader reader = getTurno.ExecuteReader();
            }
        }


        public void Modificar()
        {
            using (SqlConnection connection = SqlUtils.GetConnection())
            {
                connection.Open();
                SqlTransaction transaction = connection.BeginTransaction();

                try
                {
                    ModificarDatosTurno(connection, transaction);
                    transaction.Commit();
                }
                catch (Exception)
                {
                    transaction.Rollback();
                    throw;
                }
            }
        }

        private void ModificarDatosTurno(SqlConnection connection, SqlTransaction transaction)
        {
            string sql = "UPDATE [GD1C2012].[CRAZY_TAXI].[TL_TURNOS] SET [tur_hora_inicio] = @inicio, [tur_hora_fin] = @fin, [tur_valor_bandera] = @bandera, [tur_descripcion] = @descripcion, [tur_valor_ficha] = @ficha, [tur_activo] = @activo" + 
                            " WHERE [tur_id] = @id";
            SqlCommand modificarTurno = SqlUtils.GetNewCommand(sql);

            SqlParameter paramInicio = new SqlParameter("@inicio", SqlDbType.Decimal);
            paramInicio.IsNullable = false;
            paramInicio.Value = this.horaInicio;

            SqlParameter paramFin = new SqlParameter("@fin", SqlDbType.Decimal);
            paramFin.IsNullable = false;
            paramFin.Value = this.horaFin;

            SqlParameter paramFicha = new SqlParameter("@ficha", SqlDbType.Decimal);
            paramFicha.IsNullable = false;
            paramFicha.Value = this.valorFicha;

            SqlParameter paramBandera = new SqlParameter("@bandera", SqlDbType.Decimal);
            paramBandera.IsNullable = false;
            paramBandera.Value = this.valorBandera;

            SqlParameter paramDesc = new SqlParameter("@descripcion", SqlDbType.VarChar);
            paramDesc.IsNullable = false;
            paramDesc.Value = this.Descripcion;

            SqlParameter paramActivo = new SqlParameter("@activo", SqlDbType.Bit);
            paramActivo.IsNullable = false;
            paramActivo.Value = this.Activo;

            SqlParameter paramId = new SqlParameter("@id", SqlDbType.Int);
            paramId.IsNullable = false;
            paramId.Value = this.Id;

            modificarTurno.Parameters.Add(paramInicio);
            modificarTurno.Parameters.Add(paramFin);
            modificarTurno.Parameters.Add(paramFicha);
            modificarTurno.Parameters.Add(paramBandera);
            modificarTurno.Parameters.Add(paramDesc);
            modificarTurno.Parameters.Add(paramActivo);
            modificarTurno.Parameters.Add(paramId);

            modificarTurno.Connection = connection;
            modificarTurno.Transaction = transaction;
            modificarTurno.ExecuteNonQuery();
        }

        public int Esta()
        {
            int cant = 0;
            using (SqlConnection connection = SqlUtils.GetConnection())
            {
                string sql = "SELECT count(*) FROM CRAZY_TAXI.TL_TURNOS WHERE tur_id = @id";
                SqlCommand getTurno = SqlUtils.GetNewCommand(sql);
                
                SqlParameter paramId = new SqlParameter("@id", SqlDbType.Int);
                paramId.IsNullable = false;
                paramId.Value = this.Id;
                
                getTurno.Parameters.Add(paramId);
                getTurno.Connection = connection;
                getTurno.Connection.Open();
                cant = Convert.ToInt32(getTurno.ExecuteScalar());

                return cant;

            }
        }

        public bool EstaEntreHorasTurno(DateTime time)
        {   
            int horaFin = (int)this.horaFin;
            if(horaFin == 24)
            {
              horaFin = 0;
            }
            TimeSpan startTime = new TimeSpan((int)this.horaInicio, 0, 0);
            TimeSpan endTime = new TimeSpan(horaFin, 0, 0);

            if (endTime == startTime)
            {
                return true;
            }
            else if (endTime < startTime)
            {
                return time.TimeOfDay <= endTime ||
                    time.TimeOfDay >= startTime;
            }
            else
            {
                return time.TimeOfDay >= startTime &&
                    time.TimeOfDay <= endTime;
            }

        }


    }

}

